#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int Maxn=1e5+5,mod=998244353;
int n,m,k,S;
int a[Maxn];
struct edge{
	int u,v;
}e[Maxn];
int head[Maxn],to[Maxn<<1],nxt[Maxn<<1],cnt1;
inline void add(int u,int v){
	to[++cnt1]=v;nxt[cnt1]=head[u];
	head[u]=cnt1;
}
int val[Maxn],vis[Maxn];
inline int ksm(int a,int k){
	int res=1;
	for(;k;k>>=1,a=a*a%mod)
		if(k&1)res=res*a%mod;
	return res;
}
int ans;
void dfs(int x){
	if(x==n+1){
		for(int i=1;i<n;i++)if(val[e[i].u]==val[e[i].v])return;
		for(int i=1;i<=S;i++)vis[val[a[i]]]=1;
		int res=0;for(int i=1;i<=m;i++)res+=vis[i],vis[i]=0;
		ans=(ans+ksm(res,k))%mod;return;
	}for(int i=1;i<=m;i++)val[x]=i,dfs(x+1);
}
signed main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	n=read();m=read();k=read();S=read();
	for(int i=1;i<=S;i++)a[i]=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);add(v,u);
		e[i]={u,v};
	}dfs(1);
	printf("%lld\n",ans);
	return 0;
}
/*
4 3 1 2
1 3
1 2
2 3
1 4

6 5 56 2
6 4
1 2
2 3
3 4
4 5
1 6
*/
